#include "App/app_audio.h"

#include "System/DEBUG/debug.h"
#include "System/RTC/rtc.h"

#include "Middlewares/FREERTOS/include/FreeRTOS.h"
#include "Middlewares/FREERTOS/include/task.h"

#include "Middlewares/FATFS/ff.h"
#include "Middlewares/FATFS/ff_exfuns.h"


#include "Middlewares/AUDIO_CODEC/mp3/mp3play.h"

#include "Middlewares/Mini_UI/core/mini_ui.h"

uint8_t is_audio_play_task_start = 0;

uint8_t music_path[128];
uint8_t lrc_path[128];

/**
 * @brief       音乐播放任务
 * @param       arg: 传入的参数
 * @retval      无
 */
static void audio_play_task(void *arg)
{
    uint8_t res;
    uint32_t notify_value;
    uint8_t *path;
    is_audio_play_task_start = 1;
    while (is_audio_play_task_start)
    {
        // 等待接收通知值
        xTaskNotifyWait(0, 0, &notify_value, portMAX_DELAY);
        path = (uint8_t *)notify_value;
        DEBUG_INFO("path:%s\r\n", path);
        switch (fs_get_file_type(path))
        {
        case T_WAV:
            // res = wav_play_song(path); /* 播放wav文件 */
            break;

        case T_MP3:
            res = mp3_play_song(path); /* 播放MP3文件 */
            break;

        case T_FLAC:
            // res = flac_play_song(path); /* 播放flac文件 */
            break;

        case T_APE:
            // res = ape_play_song(path); /* 播放ape文件 */
            break;
        }

        if (res & 0X80)
        {
            DEBUG_ERROR("audio error:%d\r\n", res);
        }

        break;
    }
    DEBUG_INFO("exti\r\n");
    app_audio_task_stop();
    vTaskDelete(NULL);
}

/**
 * @brief       音乐播放任务启动
 * @param       无
 * @retval      1:失败 0:成功
 */
uint8_t app_audio_task_start(void)
{
    if (is_audio_play_task_start != 0)
    {
        return 1;
    }

    if (xTaskCreate(audio_play_task, "app_audio_task", 128 + 64, NULL, 4, NULL) != pdPASS)
    {
        return 2;
    }

    return 0;
}

/**
 * @brief       音乐播放任务停止
 * @param       无
 * @retval      无
 */
void app_audio_task_stop(void)
{
    is_audio_play_task_start = 0;
}

/**
 * @brief       切换歌曲
 * @param       path: 文件路径
 * @param       state: 0:上一曲 1:下一曲
 * @retval      无
 */
void audio_switch(uint8_t *path, uint8_t state)
{
    uint8_t *name = fs_get_src_name(path);           // 获取当前播放文件名
    fs_back_folder(path);                            // 退出当前文件夹
    uint16_t index = fs_get_file_index(path, name); // 获取当前播放文件索引
    uint16_t file_num = fs_get_file_num(path);       // 获取当前文件夹下文件数量
    while (1)                                        // 循环播放当前文件夹下所有文件
    {

        if (state == 1) // 下一曲
        {
            if (index < file_num)
                index++;
            else
                index = 1;
        }
        else if (state == 0) // 上一曲
        {
            if (index > 1)
                index--;
            else
                index = file_num;
        }

        fs_enter_folder(path, index); // 进入下一个文件
        debug_printf("index:%d file_num:%d\r\n", index, file_num);
        debug_printf("music_path:%s\r\n", path);
        switch (fs_get_file_type(path))
        {
        case T_MP3:
            //            ui_music_file_browser(music_path); /* 播放MP3文件 */
            if (app_audio_task_start() == 0)
                debug_printf("audio_play_task_start success!\r\n");
            else
            {
                debug_printf("audio_play_task_start error!\r\n");
                return;
            }
            xTaskNotify(xTaskGetHandle("app_audio_task"), (uint32_t)path, eSetValueWithOverwrite);
            return;
        default:
            fs_back_folder(path);
            break;
        }
    }
}
